Android 图层与显示器

图层(Layer)和显示(Display)是 Android 系统中的两个重要概念。

图层(Layer)

图层由 Surface 和 SurfaceControl 组成。每个图层都有一组属性,定义了它与其他图层的交互方式。图层属性包括:

位置(Positional):定义图层在显示中的位置。包括图层边缘的位置信息以及与其他图层的Z顺序(它是在其他图层前面还是后面)相关的信息。

内容(Content):定义了图层中显示的内容在位置属性定义的边界内应如何呈现。包括裁剪(将内容的一部分扩展以填充图层的边界)和变换(显示旋转或翻转的内容)等信息。

合成(Composition):定义图层与其他图层的合成方式。包括混合模式(blending)和用于透明合成的图层整体透明度值(layer-wide alpha)。

优化(Optimization):提供的信息对于正确合成图层并不是严格必要的,但可以被硬件合成器(HWC)设备用来优化其合成性能。包括图层的可见区域以及自上一帧以来已更新的部分等信息。


显示(Display)

显示是合成(Composition)的另一个重要组成部分。一个系统可以有多个显示器,并且在正常系统操作期间可以添加或移除显示器。显示器的添加/移除是在 HWC 的请求或框架的请求下进行的。

当外部显示器连接或断开设备时,HWC设备会请求添加或移除显示器,这被称为热插拔。客户端请求虚拟显示器,其内容被渲染到离屏缓冲区而不是物理显示器上。

虚拟显示(Virtual displays)

SurfaceFlinger 支持内部显示(内置于手机或平板电脑)、外部显示(例如通过HDMI连接的电视)以及一个或多个虚拟显示,使合成输出在系统中可用。虚拟显示可用于录制屏幕或将屏幕发送到网络上。为虚拟显示生成的帧被写入BufferQueue。

虚拟显示器可以与主显示器共享相同的图层集合(图层堆栈,the layer stack),也可以拥有自己的图层集合。虚拟显示器没有 VSYNC,因此内部显示器的 VSYNC 会触发所有显示器的合成。

在支持的 HWC 实现中,虚拟显示器可以与 OpenGL ES(GLES)、HWC 或 GLES 和 HWC 同时合成。在不支持的实现中,虚拟显示器始终使用 GLES 进行合成。


应用案例:屏幕录制

Android 系统录屏的原理可以简化为以下几个步骤:

  1. 录屏命令:用户使用 screenrecord 命令来开始录制屏幕,这将把屏幕内容保存为 .mp4 文件。

  2. 图像捕捉:系统利用一个组件,SurfaceFlinger,来捕捉屏幕上的图像。SurfaceFlinger 负责将不同应用和系统界面的图像合成为一个整体。

  3. 视频编码:捕捉到的图像数据传送给视频编码器。编码器的工作是将这些图像转换成视频格式。视频编码器由一个独立的系统进程(mediaserver)管理。

  4. BufferQueue:为了高效地处理这些数据,系统使用了一个名为 BufferQueue 的技术。BufferQueue 是一种数据结构,用于在不同的系统组件之间高效地传输图像数据。

  5. 虚拟显示:screenrecord 通过 SurfaceFlinger 创建一个虚拟显示屏,这个虚拟屏幕复制了主显示屏的所有内容,并将输出发送到 mediaserver 进程。

  6. 数据传输与存储:应用程序在屏幕上绘制的内容被发送到 SurfaceFlinger,然后 SurfaceFlinger 将这些内容合并为一个完整的图像帧,并直接发送给 mediaserver 中的视频编码器。编码后的视频数据最终被写入文件中。


本文作者:Maeiee

本文链接:Android 图层与显示器

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!